﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SIMCFachadaNegocio
{
    public abstract class FachadaBase
    {
        // Reglas de Negocio que no se cumplieron
        protected Dictionary<string, object> reglasRotas;

        public FachadaBase()
        {
            reglasRotas = new Dictionary<string, object>();
        }

        #region Interfaz Publica
        /// <summary>
        /// El Objeto se encuentra en estado Valido?
        /// i.e., Todas las reglas de negocio han sido satisfacidas?
        /// </summary>
        public bool EsValido
        {
            get { return reglasRotas.Count == 0; }
        }

        /// <summary>
        /// List broken rules
        /// </summary>
        public string ReglasRotas
        {
            get
            {
                return (reglasRotas.Count > 0)
                    ? MostrarReglasRotas().ToString()
                    : string.Empty;
            }
        }

        /// <summary>
        /// Diagnostics - lista de las reglas rotas.
        /// </summary>
        protected string MostrarReglasRotas()
        {
            StringBuilder errors = new StringBuilder();

            foreach (string key in reglasRotas.Keys)
            {
                errors.AppendLine("* " + key);
            }

            return errors.ToString();
        }

        #endregion        

        #region Implementación
      
        protected void AgregarRegla(SIMCReglasNegocio.IReglaDeNegocio p_Regla)
        {
            bool estaRota = !p_Regla.Validar();

            if (estaRota)
            {
                AgregarReglaRota(p_Regla.MensajeError);
            }
            else
            {
                RemoverReglaRota(p_Regla.MensajeError);
            }
        }

        /// <summary>
        /// Agrega la regla rota en la lista, verificando que no se encuentre
        /// </summary>
        /// <param name="p_Regla">Mensaje de error de la regla de negocio.</param>
        private void AgregarReglaRota(string p_Regla)
        {
            bool esNueva = !reglasRotas.ContainsKey(p_Regla);

            if (esNueva)
            {
                reglasRotas.Add(p_Regla, null);
            }
        }

        /// <summary>
        /// Elimina la regla rota de la lista
        /// </summary>
        /// <param name="p_Regla">Descripción de la regla rota.</param>
        private void RemoverReglaRota(string p_Regla)
        {
            reglasRotas.Remove(p_Regla);
        }

        #endregion 
    }
}
